home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / AllPlaton / StrikeCommander / StrikeCommander.AMOS / StrikeCommander.amosSourceCode < prev   
Encoding:
AMOS Source Code  |  1993-08-19  |  15.2 KB  |  577 lines

  1. ' *****************************************
  2. ' *                                       *
  3. ' *         Strike Commander V1.0         *
  4. ' *        Written by Chris Hodges        *
  5. ' *       Graphics by  Peter Hodges       *
  6. ' *  Additional ideas by  Thomas B�ttner  *
  7. ' *                                       *
  8. ' *****************************************
  9. '
  10. Dim SC(1),X(1),Y(1),M(1),I(1),SX(1),SY(1),ACC(1),SH(1),RX(39),RY(39)
  11. Dim COI(1),COMP(1)
  12. Dim T$(33)
  13. 'RIPGRAPHICS 
  14. Do 
  15.   Gosub TITLE
  16.   Load "StrikeCommander.sam",5
  17.   ACCL=1 : COMP(0)=1 : COMP(1)=0
  18.   Gosub RAWINIT
  19.   Gosub MAIN
  20.   Erase 5
  21. Loop 
  22. End 
  23. TITLE:
  24.   Hide 
  25.   Track Load "StrikeCommander.mus",3
  26.   Track Loop On : Track Play 
  27.   Unpack 10 To 0 : Screen Hide 
  28.   Get Block 1,48,0,224,80
  29.   Screen Open 1,320,256,4096,0
  30.   Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 
  31.   Get Palette 0
  32.   For A=0 To 127
  33.     Screen Copy 0,0,A*2,320,A*2+1 To 1,0,A*2
  34.     Screen Copy 0,0,255-A*2,320,256-A*2 To 1,0,255-A*2
  35.     If A and 1 Then Wait Vbl 
  36.   Next 
  37.   Screen Open 0,320,80,64,0 : Screen Hide 
  38.   Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 
  39.   Ink 1,0
  40.   Gr Writing 0
  41.   T$(0)="" : T$(1)="" : T$(2)="" : T$(3)=""
  42.   T$(4)="" : T$(5)=""
  43.   T$(6)="Strike Commander" : T$(7)="** Turbo Version **"
  44.   T$(8)="Written by Chris Hodges" : T$(9)=""
  45.   T$(10)="Graphics by Peter Hodges" : T$(11)=""
  46.   T$(12)="Additional ideas and help by" : T$(13)="Thomas B�ttner"
  47.   T$(14)="" : T$(15)="Inspired by the game"
  48.   T$(16)="Biplanes by Peter Mason" : T$(17)=""
  49.   T$(18)="" : T$(19)="Control:"
  50.   T$(20)="Up    Accelerate    " : T$(21)="Left  Clockwise     "
  51.   T$(22)="Right Anti-clockwise" : T$(23)="Down  Brake         "
  52.   T$(24)="" : T$(25)="To activate second player"
  53.   T$(26)="press the button on joystick" : T$(27)="in the mouseport."
  54.   T$(28)="" : T$(29)="Enjoy the game!" : T$(30)=""
  55.   T$(31)="" : T$(32)="" : T$(33)=""
  56.   O=30 : P=7
  57.   Repeat 
  58.     Put Block 1
  59.     For A=0 To 10
  60.       X=160-Len(T$((A+O) mod 34))*4
  61.       Y=A*8+P-2
  62.       T$=T$((A+O) mod 34)
  63.       Ink 0 : Text X+1,Y+1,T$
  64.       Ink 63-Max(Y-60,0)/2-Max(20-Y,0)/2 : Text X,Y,T$
  65.     Next 
  66.     While Timer<4 : Wait Vbl : Wend 
  67.     Wait Vbl 
  68.     While Peek($DFF006)<Y Hard(80) : Wend 
  69.     Timer=0
  70.     Screen Copy 0,48,0,272,80 To 1,48,0
  71.     Dec P : If P<0 Then Add O,1,0 To 33 : P=7
  72.     I$=Inkey$
  73.   Until(I$<>"") or(Fire(1) or Fire(0))
  74.   Cls 0
  75.   Del Block 1
  76.   Screen 1
  77.   For A=0 To 127
  78.     Screen Copy 0,0,0,320,1 To 1,0,A*2
  79.     Screen Copy 0,0,0,320,1 To 1,0,255-A*2
  80.     If A and 1 Then Wait Vbl 
  81.   Next 
  82.   Track Stop 
  83.   Screen Close 0
  84.   Screen Close 1
  85.   Erase 3
  86.   If Asc(I$)=27 Then End 
  87. Return 
  88. MAIN:
  89.   Gosub INIT
  90.   Do 
  91.     If Fire(0) Then COMP(0)=0
  92.     Bob Draw 
  93.     Screen Swap 
  94.     Wait Vbl : T=Timer
  95.     Bob Clear 
  96.     For TI=1 To Min(T,8)
  97.       Gosub EXTRAS
  98.       For A=0 To 1
  99.         If I(A)>-1 Then Gosub STEERING Else Gosub EXLOSI
  100.         SAMSPEED[1+A,5000+Abs(M(A))*70]
  101.       Next 
  102.     Next 
  103.     Timer=0
  104.     If GAMEOVER Then Gosub GAMEOVER Else Gosub INGAME
  105.     I$=Upper$(Inkey$)
  106.     If I$="P" Then Gosub PAUSE
  107.     Exit If Asc(I$)=27
  108.   Loop 
  109.   Sam Stop 
  110.   Fade 2 : Wait 33 : Amal Off : Bob Off 
  111.   Screen 1 : Rainbow Del : View 
  112.   Fade 1 : Wait 17
  113.   Screen Close 0
  114.   Screen Close 1
  115. Return 
  116. EXTRAS:
  117.   If LEMX>-1 Then Gosub LEMMING
  118.   If Rnd(2000)=0 and LEMX=-1 Then LEMX=0 : LEMY=168 : LEMI=0 : Sam Play K,6 : Gosub CHCH
  119.   If SMILY>-1 Then Gosub SMILY
  120.   If Rnd(2000)=0 and SMILY=-1 Then Inc SMILY : Sam Play K,7 : Gosub CHCH
  121.   If UFOI>-1 Then Gosub UFO
  122.   If Rnd(1000)=0 and UFOI=-1 Then Inc UFOI : If GAMEOVER=0 Then Sam Play 8,1 : Gosub CHCH
  123.   If TSX<>0 Then Gosub TURM
  124. Return 
  125. CHCH:
  126.   If UFOI>-1 Then Sam Loop On : Sam Loop On 4 : K=4 Else Sam Loop On 8 : K=12-K
  127.   If GAMEOVER>0 and UFOI>-1 Then Sam Loop On 8
  128. Return 
  129. PAUSE:
  130.   TT=Timer : Sam Stop 11
  131.   Screen 1 : Home : Centre "GAME PAUSED!"
  132.   While(Inkey$="") and Fire(0)=0 and Fire(1)=0
  133.     Bob Draw 
  134.     Screen Swap 
  135.     Multi Wait 
  136.     Bob Clear 
  137.   Wend 
  138.   Centre "            " : Screen 0
  139.   If GAMEOVER Then Timer=TT : Return 
  140.   Sam Play 1,2,5000
  141.   Sam Play 2,2,5000
  142.   If UFOI>-1 and UFOI<4 Then Sam Play 8,1 : Gosub CHCH
  143.   Timer=TT
  144. Return 
  145. GAMEOVER:
  146.   Inc GAMEOVER
  147.   If(Fire(0) or Fire(1)) and(GAMEOVER>50) Then GAMEOVER=Max(GAMEOVER,1000)
  148.   If GAMEOVER=19 Then Bob Off 12 : Bob Off 13
  149.   If GAMEOVER=1000 Then Fade 2
  150.   If GAMEOVER=1062 Then Screen 1 : Fade 1 : Screen 0
  151.   If GAMEOVER=1078 Then Gosub INIT
  152. Return 
  153. SMILY:
  154.   Inc SMILY : If SMILY>38 Then SMILY=-1 : Bob Off 6
  155.   Bob 6,175,125,74-Abs(SMILY/3-6)
  156. Return 
  157. LEMMING:
  158.   Inc LEMX : Add LEMI,1,0 To 20
  159.   If LEMX>637 Then LEMX=-1 : Bob Off 7 : Return 
  160.   While Point(LEMX/2,LEMY)<>7 : Dec LEMY : Wend 
  161.   While Point(LEMX/2,LEMY+1)=7 : Inc LEMY : Wend 
  162.   Bob 7,LEMX/2,LEMY,LEMI/3+80
  163. Return 
  164. UFO:
  165.   If UFOI>3 Then Goto UFOEXPLO
  166.   Inc UFOY
  167.   Add UFOX,Rnd(2)-1
  168.   Add UFOI,1,0 To 3
  169.   If UFOY>400 Then Add UFOX,Sgn(UFOX-160)*8
  170.   If UFOX<-8 or UFOX>324
  171.     UFOI=-1 : UFOX=160 : UFOY=-8 : Sam Stop 8
  172.     Bob Off 8
  173.     Return 
  174.   End If 
  175.   Bob 8,UFOX,UFOY/3,UFOI+64
  176. Return 
  177. UFOEXPLO:
  178.   If UFOI=25 Then UFOI=-1 : UFOX=160 : UFOY=-8 : Bob Off 8 : Return 
  179.   Inc UFOI
  180.   Bob 8,UFOX,UFOY/3,UFOI+37
  181. Return 
  182. TURM:
  183.   Add TX,TSX : Add TY,TSY
  184.   If TY>22100 Then TY=22100 : TSY=0 : TSX=0
  185.   Add TSY,8
  186.   X=TX/100 : Y=TY/100
  187.   If OTX<>X or OTY<>Y Then Bob 9,X,Y, : OTX=X : OTY=Y
  188. Return 
  189. INGAME:
  190.   Gosub KOLLISION
  191.   If SC(0)=20 or SC(1)=20
  192.     Inc GAMEOVER : Sam Stop 11 : Screen Offset 0,0,15
  193.     Screen 1 : Home : Centre "GAME OVER!" : Screen 0
  194.   End If 
  195. Return 
  196. RAWINIT:
  197.   Hide 
  198.   Randomize Timer
  199.   Wait Vbl : Timer=0
  200.   For A=0 To 14000 : Next 
  201.   T=Timer
  202.   If T<4 Then TURBO=T
  203.   Degree 
  204.   For A=0 To 39
  205.     RX(A)=Cos(A*9)*100
  206.     RY(A)=Sin(A*9)*100
  207.   Next 
  208.   Sam Bank 5
  209.   Volume 15,63
  210.   Screen Open 1,320,17,2,0
  211.   Curs Off : Paper 0 : Pen 1 : Cls 
  212.   Palette 0,0
  213.   Screen Display 1,128,281,320,8
  214.   Screen Open 0,320,256,32,0
  215.   Curs Off : Flash Off : Paper 0 : Pen 1
  216.   For A=0 To 31 : Colour A,0 : Next 
  217.   Screen Display 0,128,40,320,240
  218.   Screen Offset 0,0,15
  219.   Double Buffer 
  220.   Autoback 0
  221.   Bob Update Off 
  222. Return 
  223. INIT:
  224.   Rainbow Del : View 
  225.   For A=1 To 28
  226.     Trap Bob A,-50,-50,
  227.   Next 
  228.   Bob Draw : Screen Swap : Wait Vbl : Bob Clear 
  229.   Bob Draw : Screen Swap : Wait Vbl : Bob Clear 
  230.   Gosub INITSHOTS
  231.   Cls 7
  232.   'Make Mask 
  233.   Paste Bob 0,100,100
  234.   Paste Bob 0,250,101
  235.   Set Rainbow 0,7,256,"","",""
  236.   On Rnd(2)+1 Gosub NIGHT,DAYDAWN,DAYLIGHT
  237.   Screen Copy Logic(0) To Physic(0)
  238.   Bob 9,160,221,104 : TX=16000 : TY=22100 : TSX=0 : TSY=0
  239.   BETTERRAIN[0,255]
  240.   Screen 1 : Cls : Fade 1,0,$FFF : Screen 0 : Wait 16
  241.   Rainbow 0,0,38,256
  242.   If TURBO Then Gosub WOLKEN
  243.   For A=0 To 1
  244.     I(A)=A*20 : X(A)=A*31900 : Y(A)=24800 : COI(A)=I(A)
  245.     SX(A)=0 : SY(A)=0 : M(A)=0 : ACC(A)=0
  246.     SC(A)=0
  247.   Next 
  248.   Gosub UPSCORE
  249.   Fade 2 To -1
  250.   Sam Loop On 
  251.   Sam Play 1,2,5000
  252.   Sam Play 2,2,5000
  253.   Sam Loop On 4
  254.   Timer=0 : GAMEOVER=0
  255.   LEMX=-1 : SMILY=-1
  256.   UFOI=-1 : UFOX=160 : UFOY=-8 : K=8
  257. Return 
  258. KOLLISION:
  259.   If I(0)>-1
  260.     If Bob Col(10,8 To 23)
  261.       If Col(9)
  262.         TSX=SX(0)/5 : TSY=-50+SY(0)/10
  263.         I(0)=-1
  264.       End If 
  265.       If Col(11) or(Col(8) and(UFOI>-1 and UFOI<4))
  266.         I(0)=-1 : SC(1)=SC(1)+Col(11)
  267.       End If 
  268.       If Col(22) or Col(23)
  269.         If Rnd(3)>1
  270.           Sam Play K,3 : Gosub CHCH
  271.         Else 
  272.           I(0)=-1
  273.         End If 
  274.       End If 
  275.     End If 
  276.   End If 
  277.   If I(1)>-1
  278.     If Bob Col(11,8 To 23)
  279.       If Col(9)
  280.         TSX=SX(1)/5 : TSY=-50+SY(1)/10
  281.         I(1)=-1
  282.       End If 
  283.       If Col(10) or(Col(8) and(UFOI>-1 and UFOI<4))
  284.         I(1)=-1 : SC(0)=SC(0)+Col(10)
  285.       End If 
  286.       If Col(20) or Col(21)
  287.         If Rnd(3)>1
  288.           Sam Play K,3 : Gosub CHCH
  289.         Else 
  290.           I(1)=-1
  291.         End If 
  292.       End If 
  293.     End If 
  294.   End If 
  295.   If UFOI>-1
  296.     If Bob Col(8,20 To 23) and(UFOI>-1 and UFOI<4)
  297.       UFOI=4
  298.       Sam Play 4,4 : Sam Stop 8 : Gosub CHCH
  299.       If Col(20) or Col(21)
  300.         Inc SC(0)
  301.       End If 
  302.       If Col(22) or Col(23)
  303.         Inc SC(1)
  304.       End If 
  305.       Gosub UPSCORE
  306.     End If 
  307.   End If 
  308.   For A=0 To 3
  309.     If Bob Col(20+A,8 To 12) and Amreg(A,4)>1 Then Amreg(A,4)=1
  310.   Next 
  311. Return 
  312. UPSCORE:
  313.   Screen 1
  314.   If SC(0)<10 Then A$="0" Else A$=""
  315.   A$=A$+Mid$(Str$(SC(0)),2)+At(38,0)
  316.   Home 
  317.   If SC(1)<10 Then A$=A$+"0"
  318.   A$=A$+Mid$(Str$(SC(1)),2)
  319.   Print A$;
  320.   Screen 0
  321. Return 
  322. INITSHOTS:
  323.   A$="J B; "
  324.   A$=A$+"A: L X=R0/100; L Y=R1/100; L R0=R0+R2; L R1=R1+R3; L R5=R5+1; P; "
  325.   A$=A$+"I R0<0 J E; I R0>31900 J D; I R1<1600 J B; "
  326.   A$=A$+"F: I R1>24800 J B; I R4=1 J B; I R5>50 J B; J A; "
  327.   A$=A$+"B: L R0=-90000; L R1=-90000; L X=-10; L Y=-10; L R4=1; L R5=0; C: P; I R4=0 J A; J C; "
  328.   A$=A$+"D: L R0=R0-32000; J F;"
  329.   A$=A$+"E: L R0=R0+32000; J F;"
  330.   For A=0 To 3
  331.     Bob 20+A,-10,-10,98+A/2
  332.     Channel A To Bob 20+A
  333.     Amal A,A$
  334.   Next 
  335.   Amal On 
  336. Return 
  337. WOLKEN:
  338.   For A=0 To 3-TURBO
  339.     Bob 25+A,Rnd(320),Rnd(50)+50,103
  340.     Channel A+4 To Bob 25+A
  341.     A$="A: L X=X+1; PP"+String$("P",A)+"; I X<384 J A; L X=0; J A;"
  342.     Amal A+4,A$
  343.   Next 
  344.   Amal On 
  345. Return 
  346. DAYDAWN:
  347.   Paste Bob 240,132,102
  348.   C0=0 : C1=0
  349.   For A=0 To 165
  350.     Rain(0,A)=C0*$100+C1*$10
  351.     If A mod 8=0 and C0=15 Then Inc C1
  352.     If A mod 8=0 Then C0=Min(C0+1,15)
  353.   Next 
  354.   For A=0 To 89
  355.     Rain(0,A+166)=Min(4+A/5,15)+Max(A/7-8,0)*$10
  356.   Next 
  357. Return 
  358. DAYLIGHT:
  359.   C0=0 : C1=8
  360.   Ink 8
  361.   Circle 100,50,8
  362.   Paint 100,50,1
  363.   For A=0 To 165
  364.     Rain(0,A)=C0*$100+C1*$10+15
  365.     If A mod 12=0 and C1=15 Then Inc C0
  366.     If A mod 8=0 Then C1=Min(C1+1,15)
  367.   Next 
  368.   For A=0 To 89
  369.     Rain(0,A+166)=Min(4+A/4,15)+Max(A/8-8,0)*$10
  370.   Next 
  371. Return 
  372. NIGHT:
  373.   For A=0 To 99
  374.     X=Rnd(320)
  375.     Y=Rnd(150)
  376.     If Point(X,Y)=7 Then Plot X,Y,Rnd(3)+1
  377.   Next 
  378.   Paste Bob 216,64,63
  379.   C0=4 : C2=0
  380.   For A=0 To 165
  381.     Rain(0,A)=C0*$100+C2
  382.     If A mod 14=0 and C0=0 Then Inc C2
  383.     If A mod 8=0 Then C0=Max(C0-1,0)
  384.   Next 
  385.   For A=0 To 89
  386.     Rain(0,A+166)=Min(4+A/10,15)+Max(A/7-8,0)*$10
  387.   Next 
  388. Return 
  389. EXLOSI:
  390.   If GAMEOVER
  391.     I(A)=(I Bob(10+A)-A*20-1)*2
  392.     If Y(A)>24900 and SY(A)>0 : SY(A)=-Max((SY(A)*3)/2,-300) : End If 
  393.     Add X(A),SX(A),0 To 31900
  394.     Return 
  395.   End If 
  396.   If I(A)=-1 Then Sam Play K,4 : M(A)=0 : Inc SC(1-A) : Gosub UPSCORE : Gosub CHCH
  397.   If I(A)>-13 Then Screen Offset 0,0,10+Rnd(4) Else Screen Offset 0,0,15
  398.   If I(A)<-10 Then Bob Off 10+A Else Bob 10+A,X(A)/100,Y(A)/100,
  399.   If I(A)<-21 Then Bob Off 12+A Else Bob 12+A,X(A)/100,Y(A)/100,41+Abs(I(A))
  400.   Dec I(A)
  401.   SX(A)=SX(A)-SX(A)/8
  402.   SY(A)=SY(A)-SY(A)/8+20
  403.   Add X(A),SX(A),0 To 31900
  404.   Add Y(A),SY(A)
  405.   If Y(A)>24900 and SY(A)>0 Then SY(A)=-SY(A)
  406.   If I(A)<-40
  407.     I(A)=A*20 : X(A)=A*31900 : Y(A)=24800
  408.     SX(A)=0 : SY(A)=0 : M(A)=0 : ACC(A)=0 : COI(A)=I(A)
  409.   End If 
  410. Return 
  411. STEERING:
  412.   Bob 10+A,X(A)/100,Y(A)/100,1+A*20+I(A)/2
  413.   If COMP(A) Then Goto COMPMOVE
  414.   If Jleft(A) Then Add I(A),-1,0 To 39
  415.   If Jright(A) Then Add I(A),1,0 To 39
  416.   If Jdown(A) and M(A)>0 Then M(A)=Max(M(A)-3,0) : ACC(A)=0
  417.   If Y(A)=24800 Then Gosub STAR Else Gosub FLIGHT
  418.   Add X(A),SX(A),0 To 31900
  419.   Add Y(A),SY(A)
  420.   If Y(A)<1500 Then Y(A)=1500 : M(A)=0 : SY(A)=0
  421.   If Y(A)>24900 Then I(A)=-1
  422. Return 
  423. COMPMOVE:
  424.   If Y(A)=24800 Then Gosub COMPSTAR Else Gosub COMPFLIGHT
  425.   Add X(A),SX(A),0 To 31900
  426.   Add Y(A),SY(A)
  427.   If Y(A)<1500 Then Y(A)=1500 : M(A)=0 : SY(A)=0
  428.   If Y(A)>24900 Then I(A)=-1
  429.   If I(A)<0 Then Return 
  430.   S=COI(A)-I(A)
  431.   If Abs(S)<=39-Abs(S)
  432.     Add I(A),Sgn(S),0 To 39
  433.   Else 
  434.     Add I(A),-Sgn(S),0 To 39
  435.   End If 
  436. Return 
  437. COMPFLIP:
  438.   If I(A)>19 and I(A)<30 and COI(A)>29 Then COI(A)=60-COI(A) : Return 
  439.   If I(A)>9 and I(A)<20 and COI(A)<10 Then COI(A)=20-COI(A) : Return 
  440.   If COI(A)>9 and COI(A)<20 and I(A)<10 Then COI(A)=20-COI(A) : Return 
  441.   If COI(A)>19 and COI(A)<30 and I(A)>29 Then COI(A)=60-COI(A) : Return 
  442. Return 
  443. COMPSTAR:
  444.   If(M(A)<100 and(M(1-A)>0 or M(A)>0)) or Rnd(50)=0 Then Inc M(A)
  445.   If M(A)>70 Then COI(A)=36+Rnd(2) : Gosub COMPFLIP
  446.   SX=(M(A)*RX(I(A)))/32
  447.   SY=(M(A)*RY(I(A)))/32
  448.   Add SX(A),Max(Min(SX-SX(A),50),-50)
  449.   Add SY(A),Max(Min(SY-SY(A),50),-50)
  450. Return 
  451. COMPFLIGHT:
  452.   If M(A)>50 and M(A)<100 Then Inc M(A)
  453.   FIRSH=Rnd(60)
  454.   D=M(A)*20
  455.   DY#=(Y(1-A)+SY(1-A)*2-Y(A)) : DX#=(X(1-A)+SY(1-A)*2-X(A))
  456.   If DX#<>0 : W=Atan(DY#/DX#) : End If 
  457.   If DX#=0 and DY#>0 : W=270 : End If 
  458.   If DX#=0 and DY#<0 : W=90 : End If 
  459.   If DX#>0 : Add W,180 : End If 
  460.   If Abs(X(A)-X(1-A))+Abs(Y(A)-Y(1-A))<D*4
  461.     COI(A)=(W+360)/9
  462.     If((COI(A)+20) mod 40)=I(A) : FIRSH=0 : End If 
  463.   Else 
  464.     COI(A)=((W+360)/9+20) mod 40
  465.     If COI(A)=I(A) : FIRSH=0 : End If 
  466.   End If 
  467.   If Rnd(50)=0 and I(A)=COI(A) Then COI(A)=Rnd(39)
  468.   If Y(A)>22500-D Then COI(A)=38-(Y(A)-23000+D)/1000
  469.   If Y(A)<4000+D Then COI(A)=8-((Y(A)-D)/500)
  470.   DT=Abs(X(A)-TX)+Abs(Y(A)-TY)
  471.   If DT<5000+D Then COI(A)=34 : Gosub COMPFLIP
  472.   SX=(M(A)*RX(I(A)))/32
  473.   SY=(M(A)*RY(I(A)))/32
  474.   For S=(1-A)*2 To(1-A)*2+1
  475.     DT=Abs(Amreg(S,0)-X(A))+Abs(Amreg(S,1)-Y(A))
  476.     If DT<3000 and I(A)=COI(A) Then COI(A)=Rnd(39)
  477.   Next 
  478.   If M(A)>50
  479.     If M(A)<70 : Add Y(A),70-M(A) : End If 
  480.     If M(A)<60 : COI(A)=36+Rnd(3) : End If 
  481.     Add SX(A),Max(Min(SX-SX(A),50),-50)
  482.     Add SY(A),Max(Min(SY-SY(A),50),-50)
  483.   Else 
  484.     COI(A)=10
  485.     SY(A)=Min(SY(A)+4,300) : SY=SY(A) : Dec M(A)
  486.     If SY>250 and I(A)>7 and I(A)<13
  487.       M(A)=Max(M(A),51)
  488.     End If 
  489.   End If 
  490.   If Abs(X(A)-X(1-A))+Abs(Y(A)-Y(1-A))<D*6 Then Add COI(A),A*2-1,0 To 39
  491.   S=Sgn(RY(I(A))/85)
  492.   If M(A)>30 Then M(A)=Max(Min(M(A)+S*3-Abs(S),150),0)
  493.   If FIRSH=0 and(Amreg(A*2,4)=1 or Amreg(A*2+1,4)=1)
  494.     Sam Play K,5,8000 : Gosub CHCH
  495.     If Amreg(A*2,4)=1 : S=A*2 : Else S=A*2+1 : End If 
  496.     Amreg(S,0)=X(A)+SX(A)*5
  497.     Amreg(S,1)=Y(A)+SY(A)*5
  498.     Amreg(S,2)=RX(I(A))*6
  499.     Amreg(S,3)=RY(I(A))*6
  500.     Amreg(S,4)=0
  501.   End If 
  502. Return 
  503. STAR:
  504.   If(Jup(A) or ACC(A)) and M(A)<100 Then Inc M(A) : If ACCL Then ACC(A)=1
  505.   SX=(M(A)*RX(I(A)))/32
  506.   SY=(M(A)*RY(I(A)))/32
  507.   Add SX(A),Max(Min(SX-SX(A),50),-50)
  508.   Add SY(A),Max(Min(SY-SY(A),50),-50)
  509.   If I(A)<>A*20 and M(A)=0 Then I(A)=-1
  510. Return 
  511. FLIGHT:
  512.   If(Jup(A) or ACC(A)) and M(A)>50 and M(A)<100 Then Inc M(A) : If ACCL Then ACC(A)=1
  513.   SX=(M(A)*RX(I(A)))/32
  514.   SY=(M(A)*RY(I(A)))/32
  515.   If M(A)>50
  516.     If M(A)<70 : Add Y(A),70-M(A) : End If 
  517.     Add SX(A),Max(Min(SX-SX(A),50),-50)
  518.     Add SY(A),Max(Min(SY-SY(A),50),-50)
  519.   Else 
  520.     SY(A)=Min(SY(A)+4,300) : SY=SY(A) : Dec M(A)
  521.     If SY>250 and I(A)>7 and I(A)<13
  522.       M(A)=Max(M(A),51)
  523.     End If 
  524.   End If 
  525.   S=Sgn(RY(I(A))/85)
  526.   If M(A)>30 Then M(A)=Max(Min(M(A)+S*3-Abs(S),150),0)
  527.   If Fire(A)=0 Then SH(A)=0
  528.   If Fire(A) and SH(A)=0 and(Amreg(A*2,4)=1 or Amreg(A*2+1,4)=1)
  529.     SH(A)=1 : Sam Play K,5,8000 : Gosub CHCH
  530.     If Amreg(A*2,4)=1 : S=A*2 : Else S=A*2+1 : End If 
  531.     Amreg(S,0)=X(A)+SX(A)*2
  532.     Amreg(S,1)=Y(A)+SY(A)*2
  533.     Amreg(S,2)=RX(I(A))*6
  534.     Amreg(S,3)=RY(I(A))*6
  535.     Amreg(S,4)=0
  536.   End If 
  537. Return 
  538. Procedure RIPGRAPHICS
  539.   Load Iff "dh2:amosgfx/StrikeCommanderData.iff",0
  540.   Colour 7,0
  541.   For A=0 To 74
  542.     Get Sprite A+1,(A mod 20)*16,(A/20)*16 To(A mod 20)*16+16,(A/20)*16+16
  543.     Hot Spot A+1,7,7
  544.   Next 
  545.   For A=0 To 7
  546.     Get Sprite 80+A,A*8,112 To A*8+7,122
  547.     Hot Spot 80+A,2,9
  548.   Next 
  549.   Get Sprite 98,224,48 To 232,50
  550.   Get Sprite 99,232,48 To 240,50
  551.   Get Sprite 100,0,152 To 320,250
  552.   Get Sprite 101,0,104 To 320,110
  553.   Get Sprite 102,0,64 To 64,93
  554.   Get Sprite 103,64,64 To 128,91
  555.   Get Sprite 104,128,64 To 158,98
  556.   Hot Spot 103,64,0
  557.   Hot Spot 104,19,0
  558. End Proc
  559. Procedure BETTERRAIN[R,L]
  560.   T=1 : AF=Rain(R,0)
  561.   For A=2 To L-1
  562.     Inc T
  563.     If(Rain(R,A)<>AF)
  564.       AF=Rain(R,A)
  565.       If T>3
  566.         Rain(R,A-2)=AF
  567.       End If 
  568.       T=0
  569.     End If 
  570.   Next 
  571. End Proc
  572. Procedure SAMSPEED[KANAL,FREQ]
  573.   RATE=3579545/FREQ
  574.   For A=0 To 3
  575.     If Btst(A,KANAL) Then Doke $DFF0A6+A*16,RATE
  576.   Next 
  577. End Proc